From 8b6aad5d2f5f19a15eb3bfc4ad3820bd2db52b62 Mon Sep 17 00:00:00 2001 From: Jimi Xenidis Date: Tue, 28 Nov 2006 16:56:40 -0500 Subject: [PATCH] [XEN][POWERPC] Generalized parallel IPI handlers Our problem with x86 do_IRQ is that it does not respect IRQ_PER_CPU, so make our logic reflect that generically. We remove the spin lock in this case, since the programming convention is to update irq descs atomically (if at all). This patch allows read_clocks to work properly. Signed-off-by: Amos Waterland Signed-off-by: Jimi Xenidis Signed-off-by: Hollis Blanchard --HG-- extra : transplant_source : %1E%1Ac%40%81%29%BE%A2%D8%7FH%5CR%F1%BE%21%AD%A3_%F0 --- xen/arch/powerpc/external.c | 6 ++---- xen/arch/powerpc/mpic_init.c | 6 ------ xen/include/asm-powerpc/smp.h | 1 - 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/xen/arch/powerpc/external.c b/xen/arch/powerpc/external.c index 5801efb51a..59d0904bf1 100644 --- a/xen/arch/powerpc/external.c +++ b/xen/arch/powerpc/external.c @@ -82,15 +82,13 @@ void do_external(struct cpu_user_regs *regs) vec = xen_mpic_get_irq(regs); - if (vector_is_ipi(vec)) { - /* do_IRQ is fundamentally broken for reliable IPI delivery. */ + if (irq_desc[vec].status & IRQ_PER_CPU) { + /* x86 do_IRQ does not respect the per cpu flag. */ irq_desc_t *desc = &irq_desc[vec]; regs->entry_vector = vec; - spin_lock(&desc->lock); desc->handler->ack(vec); desc->action->handler(vector_to_irq(vec), desc->action->dev_id, regs); desc->handler->end(vec); - spin_unlock(&desc->lock); } else if (vec != -1) { DBG("EE:0x%lx isrc: %d\n", regs->msr, vec); regs->entry_vector = vec; diff --git a/xen/arch/powerpc/mpic_init.c b/xen/arch/powerpc/mpic_init.c index 5d5187a80a..bda732bb25 100644 --- a/xen/arch/powerpc/mpic_init.c +++ b/xen/arch/powerpc/mpic_init.c @@ -448,9 +448,3 @@ int xen_mpic_get_irq(struct cpu_user_regs *regs) return mpic_get_one_irq(mpic, regs); } - -int vector_is_ipi(int vector) -{ - BUG_ON(!mpic); - return (mpic->ipi_offset <= vector) && (vector < mpic->ipi_offset + 4); -} diff --git a/xen/include/asm-powerpc/smp.h b/xen/include/asm-powerpc/smp.h index 4916f1045c..51b55f44fb 100644 --- a/xen/include/asm-powerpc/smp.h +++ b/xen/include/asm-powerpc/smp.h @@ -45,7 +45,6 @@ void smp_message_recv(int msg, struct cpu_user_regs *regs); void smp_call_function_interrupt(struct cpu_user_regs *regs); void smp_event_check_interrupt(void); void send_IPI_mask(cpumask_t mask, int vector); -int vector_is_ipi(int vector); #undef DEBUG_IPI #ifdef DEBUG_IPI -- 2.30.2